PL/SQL Security

Database Tutorials - পিএল/এসকিউএল (PL/SQL)
150
150

PL/SQL নিরাপত্তা নিশ্চিত করার জন্য কিছু গুরুত্বপূর্ণ কৌশল এবং অনুশীলন রয়েছে যা ডেটাবেসের নিরাপত্তা বৃদ্ধি করতে সাহায্য করে। PL/SQL কোডের নিরাপত্তা শুধুমাত্র কুইরি বা ফাংশনের সুরক্ষা নয়, বরং Access Control, SQL Injection Protection, Error Handling, এবং Privileges Management নিয়েও কাজ করতে হয়। নিচে PL/SQL নিরাপত্তা সংক্রান্ত কিছু মূল বিষয় এবং কৌশল তুলে ধরা হলো।


1. SQL Injection প্রতিরোধ

SQL Injection হল একটি জনপ্রিয় আক্রমণ যেখানে হ্যাকাররা ইউজার ইনপুটের মাধ্যমে ক্ষতিকর SQL কোড ইনজেক্ট করে। এটি থেকে রক্ষা পেতে bind variables ব্যবহার করা সবচেয়ে ভালো পদ্ধতি। এর মাধ্যমে ডাইনামিক SQL-এ unsafe input আটকানো যায় এবং কোডের নিরাপত্তা বৃদ্ধি করা সম্ভব।

Unsafe Query Example:

DECLARE
   v_query VARCHAR2(200);
BEGIN
   v_query := 'SELECT * FROM employees WHERE emp_id = ' || :emp_id;
   EXECUTE IMMEDIATE v_query;
END;

এটি SQL Injection এর জন্য ঝুঁকিপূর্ণ, কারণ ইউজার emp_id এর মাধ্যমে SQL স্টেটমেন্টে কাস্টম কোড ইনজেক্ট করতে পারে।

Safe Query Using Bind Variables:

DECLARE
   v_query VARCHAR2(200);
BEGIN
   v_query := 'SELECT * FROM employees WHERE emp_id = :emp_id';
   EXECUTE IMMEDIATE v_query USING :emp_id;
END;

এখানে, :emp_id একটি bind variable হিসেবে ব্যবহৃত হয়েছে, যা SQL Injection আক্রমণ থেকে রক্ষা করবে।


2. Privilege Management

PL/SQL এর নিরাপত্তা নিশ্চিত করার জন্য সঠিক privileges (অধিকার) প্রদান করা অত্যন্ত গুরুত্বপূর্ণ। ইউজারদের শুধুমাত্র তাদের কাজের জন্য প্রয়োজনীয় অধিকার দেয়া উচিত এবং least privilege principle অনুসরণ করা উচিত।

Examples:

  • GRANT কমান্ড ব্যবহার করে নির্দিষ্ট ইউজারদেরকে অ্যাক্সেস নিয়ন্ত্রণ করা।
  • ইউজারদের ডেটাবেস টেবিল বা ভিউ-এ সম্পূর্ণ বা আংশিক অ্যাক্সেস দেয়া।
  • ইউজারদেরকে সঠিক EXECUTE অধিকার প্রদান।
GRANT EXECUTE ON my_package TO user1;
GRANT SELECT, INSERT ON employees TO user2;

এটি নিশ্চিত করবে যে শুধুমাত্র প্রয়োজনীয় অধিকারসহ ইউজাররা কোডটি এক্সিকিউট করতে পারবে।


3. Error Handling

নিরাপত্তার জন্য PL/SQL ব্লকে exception handling ব্যবহারের মাধ্যমে অনাকাঙ্ক্ষিত তথ্যের উন্মোচন বা অ্যাটাকারের জন্য সম্ভাব্য নিরাপত্তা দুর্বলতা হ্রাস করা যেতে পারে। Exception handling কাস্টম এরর মেসেজ তৈরি করতে সাহায্য করে, যা আক্রমণকারীকে সিস্টেমের অন্তর্নিহিত অবস্থা সম্পর্কে কোনো তথ্য দেয় না।

Unsafe Example:

BEGIN
   -- Some operation that might fail
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

এখানে, SQLERRM এর মাধ্যমে পুরো এরর মেসেজ উন্মুক্ত করা হচ্ছে, যা আক্রমণকারীদের সাহায্য করতে পারে।

Safe Example:

BEGIN
   -- Some operation that might fail
EXCEPTION
   WHEN OTHERS THEN
      -- Log the error but don't expose it to the user
      DBMS_OUTPUT.PUT_LINE('An error occurred, please contact support.');
END;

এখানে, generic error messages ব্যবহার করা হয়েছে এবং সিস্টেমের অন্তর্নিহিত তথ্য আক্রমণকারীদের সামনে আসছে না।


4. PL/SQL Code Obfuscation

PL/SQL কোডের নিরাপত্তা বাড়ানোর জন্য code obfuscation ব্যবহার করা যেতে পারে, যা কোডের কার্যকারিতা ঠিক রেখে সেটি বোঝা কঠিন করে তোলে। এটি সাধারণত কোডকে সিক্রেট রাখতে এবং reverse engineering প্রতিরোধে সাহায্য করে।

Example:

আপনি প্ল/এসকিউএল কোডের ভেরিয়েবল নাম এবং ফাংশন নাম গোপন বা পরিবর্তন করতে পারেন যাতে অন্য কেউ কোডটি সহজে না বুঝতে পারে।

-- Before Obfuscation
DECLARE
   total_salary NUMBER;
BEGIN
   total_salary := 5000;
END;
-- After Obfuscation
DECLARE
   a NUMBER;
BEGIN
   a := 5000;
END;

এটি কোডের নিরাপত্তা বাড়াতে সাহায্য করে, তবে এতে ডিবাগিং এবং মেইন্টেনেন্স জটিল হয়ে যায়।


5. Auditing and Logging

কোনো প্ল/এসকিউএল অ্যাপ্লিকেশন বা কোডের নিরাপত্তা নিশ্চিত করার জন্য auditing এবং logging অত্যন্ত গুরুত্বপূর্ণ। এর মাধ্যমে আপনি জানতে পারবেন কে কখন কী করেছে এবং কোনো অসাধু কার্যক্রম চলছে কিনা।

Example:

ডেটাবেসে DBMS_AUDIT বা DBMS_LOG ব্যবহার করে সমস্ত গুরুত্বপূর্ণ ইভেন্ট লগ করা যেতে পারে।

BEGIN
   -- Log an event
   DBMS_AUDIT.LOG_EVENT('User1 executed a sensitive operation');
END;

এটি আপনাকে সিস্টেমে যেকোনো অস্বাভাবিক কার্যক্রম শনাক্ত করতে সহায়ক হতে পারে।


6. Encryption for Sensitive Data

আপনার PL/SQL কোডে সংবেদনশীল তথ্য যেমন পাসওয়ার্ড, ক্রেডিট কার্ড নম্বর ইত্যাদি নিরাপদ রাখতে encryption ব্যবহার করা জরুরি। Oracle DBMS_CRYPTO প্যাকেজের মাধ্যমে আপনি ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারেন।

Example:

DECLARE
   v_encrypted_data VARCHAR2(100);
BEGIN
   v_encrypted_data := DBMS_CRYPTO.ENCRYPT(
                          'Sensitive Data',
                          DBMS_CRYPTO.DES_CBC_PKCS5,
                          'encryption_key'
                      );
END;

এটি নিশ্চিত করে যে সংবেদনশীল ডেটা শুধু অনুমোদিত ব্যক্তির জন্যই পড়া যাবে।


7. Use of Secure Database Connections

PL/SQL কোডে ব্যবহারকারীদের সঙ্গে সংযোগের ক্ষেত্রে secure connections ব্যবহার নিশ্চিত করুন। SSL/TLS কনফিগারেশন ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যদি ডেটাবেস সার্ভার ও অ্যাপ্লিকেশন সার্ভারের মধ্যে সংযোগ প্রক্রিয়া হয়।


8. Limiting Exposure of Sensitive Procedures

কিছু PL/SQL procedures বা ফাংশনগুলো আপনার সিস্টেমের জন্য খুবই গুরুত্বপূর্ণ এবং এগুলির এক্সিকিউশনের জন্য খুবই সীমিত অনুমতি থাকা উচিত। উদাহরণস্বরূপ, DBMS_METADATA, DBMS_SCHEDULER, DBMS_SQL ইত্যাদি এরকম কিট প্যাকেজগুলির ব্যবহার শুধুমাত্র নির্দিষ্ট ব্যবহারকারীদের কাছে সীমিত রাখতে হবে।


সারাংশ

PL/SQL নিরাপত্তা একটি ব্যাপক প্রক্রিয়া, যা নিরাপদ কোড লেখা, privileges management, SQL injection protection, encryption, এবং auditing ইত্যাদি বিষয়গুলিকে অন্তর্ভুক্ত করে। এই কৌশলগুলির মাধ্যমে আপনি আপনার PL/SQL অ্যাপ্লিকেশনগুলির নিরাপত্তা নিশ্চিত করতে পারেন এবং আক্রমণকারীদের বিরুদ্ধে সুরক্ষা বৃদ্ধি করতে পারেন।

Content added By

PL/SQL এর সিকিউরিটি ফিচার

140
140

PL/SQL (Procedural Language/SQL) একটি শক্তিশালী প্রোগ্রামিং ভাষা যা Oracle Database-এর সাথে ব্যবহৃত হয়। এটি শুধুমাত্র ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয় না, বরং ডেটা ম্যানিপুলেশন, ব্যবসায়িক লজিক এবং অটোমেশন কাজ করার জন্যও ব্যবহৃত হয়। কিন্তু যখন এটি ডেটাবেসের উপর অনেক বেশি ক্ষমতা প্রদান করে, তখন এর সিকিউরিটি ব্যবস্থা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ।

PL/SQL সিকিউরিটি ফিচারগুলি ডেটাবেস অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করতে সাহায্য করে, যেমন অপ্রত্যাশিত অ্যাক্সেস বা ম্যালিসিয়াস কোড প্রতিরোধ করা। নিচে PL/SQL এর কিছু গুরুত্বপূর্ণ সিকিউরিটি ফিচার আলোচনা করা হলো।


1. Definer এবং Invoker Rights

PL/SQL এ দুটি ধরণের অধিকার থাকে:

  • Definer Rights: যখন একটি প্ল/এসকিউএল প্রোগ্রাম (যেমন, প্রোসিডিউর বা ফাংশন) Definer Rights-এ রান করে, তখন এটি ব্যবহারকারীর অ্যাকাউন্টের অধিকার এবং অনুমতির আওতায় কার্যকর হয়। অর্থাৎ, যে ব্যবহারকারী প্রোগ্রামটি তৈরি করেছে, তার অধিকার অনুযায়ী প্রোগ্রামটি চালানো হবে।
  • Invoker Rights: যখন একটি PL/SQL প্রোগ্রাম Invoker Rights-এ রান করে, তখন এটি সেই ব্যবহারকারীর অধিকার অনুযায়ী কার্যকর হয়, যারা প্রোগ্রামটি কল করবে।

Definer Rights সাধারণত ডেটাবেস অ্যাডমিনিস্ট্রেটর বা উচ্চ-অধিকারপ্রাপ্ত ব্যবহারকারীদের জন্য উপযুক্ত, কারণ এটি উঁচু ক্ষমতা প্রদান করে। অন্যদিকে, Invoker Rights আরও নিরাপদ, কারণ এটি কলকারী ব্যবহারকারীর অধিকার অনুযায়ী সিকিউরিটি নিয়ন্ত্রণ করে।

উদাহরণ:

-- Procedure with Definer Rights
CREATE OR REPLACE PROCEDURE add_employee (
    p_emp_id IN NUMBER,
    p_name IN VARCHAR2
) IS
BEGIN
    INSERT INTO employees (emp_id, name) VALUES (p_emp_id, p_name);
END;
/

-- Procedure with Invoker Rights
CREATE OR REPLACE PROCEDURE add_employee_invoker
    AUTHID CURRENT_USER -- This ensures Invoker Rights
    (p_emp_id IN NUMBER, p_name IN VARCHAR2) IS
BEGIN
    INSERT INTO employees (emp_id, name) VALUES (p_emp_id, p_name);
END;
/

2. User Privileges এবং Authorization

PL/SQL নিরাপত্তার একটি গুরুত্বপূর্ণ অংশ হল User Privileges বা ব্যবহারকারীর অনুমতি নির্ধারণ করা। Oracle ডেটাবেসে, ব্যবহারকারীদের বিভিন্ন ধরনের অধিকার এবং অনুমতি দেওয়া হয়, যেমন:

  • SELECT: ডেটা পড়ার অনুমতি।
  • INSERT: নতুন ডেটা যোগ করার অনুমতি।
  • UPDATE: বিদ্যমান ডেটা আপডেট করার অনুমতি।
  • DELETE: ডেটা মুছে ফেলার অনুমতি।
  • EXECUTE: একটি প্রোগ্রাম (যেমন, প্রোসিডিউর, ফাংশন) চালানোর অনুমতি।

PL/SQL প্রোগ্রাম তৈরি করার সময়, সঠিক ব্যবহারকারীর অনুমতি না দিলে এক্সিকিউশন ব্যর্থ হতে পারে।

উদাহরণ:

-- Granting SELECT privilege to a user
GRANT SELECT ON employees TO user_name;

-- Granting EXECUTE privilege to a user for a procedure
GRANT EXECUTE ON add_employee TO user_name;

এছাড়া, REVOKE কমান্ড ব্যবহার করে অনুমতি প্রত্যাহার করা যায়।


3. DBMS_LOCK এবং Locking Mechanisms

Oracle ডেটাবেসে, locks ডেটাবেসের উপর একাধিক ব্যবহারকারীর অ্যাক্সেস নিয়ন্ত্রণে সাহায্য করে। PL/SQL এ, আপনি DBMS_LOCK প্যাকেজ ব্যবহার করে নির্দিষ্ট রিসোর্সে লক প্রয়োগ করতে পারেন, যাতে ডেটাবেসে কোনো অপ্রত্যাশিত পরিবর্তন বা ডেটার অপব্যবহার প্রতিরোধ করা যায়।

উদাহরণ:

-- Acquiring a lock on a resource
DECLARE
   v_lockhandle VARCHAR2(128);
BEGIN
   DBMS_LOCK.REQUEST(lockhandle => v_lockhandle, timeout => 10);
   -- Perform the database operation
   DBMS_LOCK.RELEASE(v_lockhandle);
END;
/

এটি শুধুমাত্র একটি রিসোর্স বা ডেটাবেস অপারেশন যখন অন্য কোনো ইউজার এক্সেস করবে না তখন লক রাখে।


4. Dynamic SQL এবং SQL Injection প্রতিরোধ

SQL Injection হল একটি নিরাপত্তা সমস্যা যেখানে আক্রমণকারী ডেটাবেসে ম্যালিসিয়াস SQL কোড ইনজেক্ট করতে পারে। PL/SQL-এ Dynamic SQL ব্যবহারের সময় বিশেষভাবে সাবধান থাকতে হয়। Oracle ডেটাবেসে EXECUTE IMMEDIATE এবং DBMS_SQL প্যাকেজ ব্যবহার করে সঠিকভাবে Dynamic SQL ব্যবহার করা যায়।

SQL Injection থেকে রক্ষা:

  • Bind Variables ব্যবহার করে SQL ইনজেকশনের ঝুঁকি কমানো যায়। Bind Variables ডেটার সাথে SQL কোড আলাদা করে, যার ফলে আক্রমণকারী SQL কোড ইনজেক্ট করতে পারে না।
-- Example of preventing SQL Injection using Bind Variables
DECLARE
   v_emp_id NUMBER := 1001;
   v_sql VARCHAR2(200);
BEGIN
   v_sql := 'SELECT name FROM employees WHERE emp_id = :emp_id';
   EXECUTE IMMEDIATE v_sql USING v_emp_id;
END;
/

এখানে, :emp_id একটি bind variable, যা SQL ইনজেকশন প্রতিরোধে সাহায্য করে।


5. PL/SQL Exception Handling এবং Error Logging

PL/SQL Exception Handling একটি গুরুত্বপূর্ণ সিকিউরিটি ফিচার, যেহেতু এটি ভুল বা অনাকাঙ্ক্ষিত কার্যক্রমের ক্ষেত্রে প্রোগ্রামটির সঠিক আচরণ নিশ্চিত করতে সাহায্য করে। Exception Handling ব্যবহার করে আপনি RAISE_APPLICATION_ERROR ব্যবহার করে কাস্টম এরর বার্তা তৈরি করতে পারেন, যা সিস্টেম বা ডেটাবেস লগে অপ্রত্যাশিত কার্যক্রম বা নিরাপত্তার জন্য পটেনশিয়াল সমস্যা চিহ্নিত করে।

উদাহরণ:

BEGIN
   -- Some business logic
   IF NOT EXISTS (SELECT 1 FROM employees WHERE emp_id = 1001) THEN
      RAISE_APPLICATION_ERROR(-20001, 'Employee not found!');
   END IF;
END;
/

এটি একটি কাস্টম এরর বার্তা তৈরি করবে এবং একটি নিরাপত্তা বা অবৈধ অ্যাক্সেস শনাক্ত করতে সাহায্য করবে।


6. Auditing এবং Logging

Oracle ডেটাবেসে Auditing এর মাধ্যমে সিস্টেমের সিকিউরিটি মনিটর করা যায়। PL/SQL প্রোগ্রামিংয়ের মাধ্যমে আপনি ডেটাবেসের যে সকল কার্যকলাপ বা পরিবর্তন ঘটছে তা লগে রেকর্ড রাখতে পারেন। এটি নিরাপত্তা পরিদর্শন ও অডিটিং প্রক্রিয়ায় গুরুত্বপূর্ণ ভূমিকা পালন করে।

উদাহরণ:

-- Enable auditing on a specific table
AUDIT INSERT, UPDATE, DELETE ON employees BY ACCESS;

উপসংহার

PL/SQL-এর সিকিউরিটি ফিচারগুলি ডেটাবেসের নিরাপত্তা নিশ্চিত করতে সাহায্য করে, বিশেষত definer rights, user privileges, dynamic SQL, exception handling, এবং auditing ব্যবহার করার মাধ্যমে। এগুলোর সঠিক প্রয়োগ ডেটাবেসে অবৈধ অ্যাক্সেস, ডেটার ক্ষতি বা পরিবর্তন প্রতিরোধে সহায়ক।

Content added By

Definer এবং Invoker Rights

111
111

PL/SQL এর মধ্যে Definer Rights এবং Invoker Rights দুটি গুরুত্বপূর্ণ ধারণা, যা Stored Procedures, Functions, এবং Triggers এর অধিকার (permissions) নির্ধারণে ব্যবহৃত হয়। এই অধিকারগুলি নিশ্চিত করে যে, কোন ইউজার কে কোন অ্যাকশন সম্পাদন করতে পারবে, এবং এর ফলে অ্যাপ্লিকেশন সিকিউরিটি এবং এক্সেস কন্ট্রোল নিশ্চিত করা যায়।

Definer Rights:

Definer Rights হল সেই অধিকার যেখানে কোনো Procedure, Function, অথবা Trigger যেই ইউজার দ্বারা তৈরি করা হবে, সেই ইউজারের অধিকার অনুযায়ী অ্যাকশন সম্পাদিত হয়। অর্থাৎ, যখন একটি Procedure বা Function চালানো হয়, তখন সেই ইউজারের অনুমতি অনুসারে প্রয়োজনীয় অপারেশন সম্পাদিত হয়, যিনি এই কোডটি তৈরি করেছেন (definer)।

  • Definer Rights পদ্ধতিতে, কোডের অধিকার এবং প্রিভিলেজগুলি অথর (definer) এর ওপর নির্ভর করে, যা সাধারণত সেই ইউজার যিনি সেই কোড তৈরি করেছেন।
  • এটি নিরাপদ হতে পারে, কারণ এটি কোডের নিরাপত্তা নিয়ন্ত্রণকে সুসংহত করে রাখে, বিশেষত যদি কোডে অনেক ধরনের ডেটাবেস অ্যাকসেস প্রয়োজন হয়।

Definer Rights উদাহরণ:

ধরা যাক, একটি ইউজার user_a একটি Procedure তৈরি করেছে যা অন্য একটি ইউজারের ডেটা অ্যাক্সেস করতে পারে। user_a যদি Procedure-টি Definer Rights-এ তৈরি করে, তাহলে যেই ইউজার এই Procedure চালাবে (যেমন user_b), তার ডেটাবেস অ্যাক্সেসের জন্য user_a এর অনুমতি লাগবে, কারণ কোডটি user_a দ্বারা তৈরি হয়েছে।

CREATE OR REPLACE PROCEDURE get_employee_salary
   IS
   v_salary NUMBER;
BEGIN
   -- Definer rights: user_a will have access to the data
   SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
   DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
END;

এখানে, get_employee_salary পদ্ধতি user_a দ্বারা তৈরি হয়েছে, তাই কোডটি চালানোর জন্য user_a এর অনুমতি প্রয়োজন।


Invoker Rights:

Invoker Rights হল সেই অধিকার যেখানে Procedure, Function, অথবা Trigger যেই ইউজার দ্বারা কল করা হয়, তার অধিকার অনুসারে অ্যাকশন সম্পাদিত হয়। অর্থাৎ, যদি কোন ইউজার একটি Procedure বা Function কল করে, তবে সেই ইউজারের ডেটাবেস অ্যাক্সেসের অনুমতি অনুসারে অপারেশন সম্পাদিত হবে, এবং কোডটি তৈরি করা ইউজারের (definer) অনুমতির সাথে সম্পর্কিত হবে না।

  • Invoker Rights পদ্ধতিতে, যেই ইউজার কোডটি কল করবে, তার অনুমতি অনুসারে কার্যক্রম হবে।
  • এটি সুরক্ষিত হতে পারে, কারণ এটি ব্যবহারকারীর নিজস্ব অধিকার এবং প্যারামিটার অনুসারে কাজ করে, তবে সাবধানতা অবলম্বন করা উচিত, যাতে ভুল বা অননুমোদিত অ্যাক্সেস না ঘটে।

Invoker Rights উদাহরণ:

ধরা যাক, user_a একটি Procedure তৈরি করেছে এবং সেই Procedure-টি Invoker Rights-এ তৈরি করা হয়েছে। এখন, যদি user_b এই Procedure কল করে, তবে user_b এর অনুমতি অনুযায়ী ডেটাবেস অ্যাক্সেস হবে, না যে user_a এর।

CREATE OR REPLACE PROCEDURE get_employee_salary
   IS
   v_salary NUMBER;
BEGIN
   -- Invoker rights: user_b's permissions will be used to access data
   SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
   DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
END;

এখানে, যদি user_b get_employee_salary কল করে, তাহলে সেই user_b এর অনুমতি অনুসারে ডেটাবেস অ্যাক্সেস হবে।


Definer Rights এবং Invoker Rights এর মধ্যে পার্থক্য:

AttributeDefiner RightsInvoker Rights
Who controls access?Code is executed with the privileges of the definer (creator).Code is executed with the privileges of the invoker (caller).
Use caseWhen a procedure requires higher-level permissions.When a procedure should use the caller's permissions.
SecurityMore secure, since only the definer’s privileges are required.More flexible, but might expose security risks if not handled carefully.
ExampleA stored procedure by a privileged user allows access for others.The procedure uses the privileges of the user who calls it.
Typical UsageUse when the procedure must access resources that the caller may not have access to.Use when the procedure should respect the caller's privileges.

কেন Definer Rights এবং Invoker Rights ব্যবহার করবেন?

  1. Definer Rights ব্যবহারের সুবিধা:
    • নিরাপদ, কারণ শুধুমাত্র কোডের নির্মাতা (definer) এর অনুমতি প্রয়োজন।
    • ডেটাবেসের নিরাপত্তা এবং অনুমতি নিয়ন্ত্রণ শক্তিশালী হয়।
    • প্রয়োজনে অধিক অনুমতি দেয়া যেতে পারে, যেমন ডেটাবেস অ্যাডমিনিস্ট্রেটর বা অন্য উচ্চ স্তরের ব্যবহারকারী দ্বারা তৈরি কোড।
  2. Invoker Rights ব্যবহারের সুবিধা:
    • প্রয়োগকারী (invoker) ব্যবহারকারীর অধিকার অনুসারে কোড চলতে পারে, যা একটি ডেটাবেস অ্যাপ্লিকেশনের ভিন্ন ভিন্ন ব্যবহারকারীকে স্বতন্ত্রভাবে কাজ করতে দেয়।
    • ইউজারদের নিজস্ব অনুমতি অনুসারে ডেটা অ্যাক্সেস এবং অ্যাকশন পরিচালিত হয়।

উপসংহার:

  • Definer Rights এবং Invoker Rights PL/SQL এর মধ্যে Security এবং Privilege ব্যবস্থাপনার গুরুত্বপূর্ণ অংশ।
  • আপনি যেই ধরনের অ্যাপ্লিকেশন তৈরি করছেন তার উপর ভিত্তি করে আপনি কোন ধরনের অধিকার ব্যবহার করবেন তা নির্ধারণ করতে পারেন।
Content added By

User Privileges এবং Authorization

132
132

Oracle PL/SQL এবং অন্যান্য relational databases-এ User Privileges এবং Authorization হল দুটি গুরুত্বপূর্ণ ধারণা, যেগুলি ডেটাবেসের সুরক্ষা এবং অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহৃত হয়। এগুলি নিশ্চিত করে যে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা ডেটাবেসে নির্দিষ্ট কাজ করতে পারে। সঠিকভাবে privilege এবং authorization ম্যানেজ করলে ডেটাবেসের সুরক্ষা বৃদ্ধি পায় এবং অপ্রত্যাশিত বা অবৈধ অ্যাক্সেস রোধ করা যায়।


১. User Privileges (ব্যবহারকারী অধিকার)

User Privileges হল সেই অনুমতিগুলি যা একটি নির্দিষ্ট ব্যবহারকারীকে ডেটাবেসের টেবিল, ভিউ, সূচক, প্রোসিডিউর, ফাংশন, এবং অন্যান্য অবজেক্টে অ্যাক্সেস প্রদান করে। ব্যবহারকারী যে কাজ করতে পারে, তা নির্ধারণ করে এই privileges।

ধরন অনুযায়ী Privileges:

প্রথমত, প্রিভিলেজ দুটি প্রধান শ্রেণীতে বিভক্ত হয়:

  1. System Privileges (সিস্টেম প্রিভিলেজ): এগুলি হল সিস্টেমের স্তরে অনুমতি, যেখানে ব্যবহারকারী সিস্টেমের কিছু কাজ বা অবজেক্ট পরিচালনা করতে পারে।
  2. Object Privileges (অবজেক্ট প্রিভিলেজ): এগুলি নির্দিষ্ট ডেটাবেস অবজেক্ট (যেমন টেবিল, ভিউ) অ্যাক্সেস করার জন্য দেওয়া হয়।

System Privileges:

এগুলি ব্যবহারকারীকে সিস্টেম পর্যায়ে নির্দিষ্ট কাজ করার অনুমতি দেয়, যেমন টেবিল তৈরি, ব্যবহারকারী তৈরি ইত্যাদি।

  • CREATE SESSION: একটি ব্যবহারকারীকে ডেটাবেসে লগ ইন করার অনুমতি দেয়।
  • CREATE TABLE: ব্যবহারকারীকে একটি টেবিল তৈরি করার অনুমতি দেয়।
  • ALTER ANY TABLE: ব্যবহারকারীকে যেকোনো টেবিলের স্ট্রাকচার পরিবর্তন করার অনুমতি দেয়।
  • DROP USER: ব্যবহারকারীকে অন্য কোনো ব্যবহারকারীকে ডিলিট করার অনুমতি দেয়।

Object Privileges:

এগুলি নির্দিষ্ট ডেটাবেস অবজেক্টের উপর ভিত্তি করে, যেমন টেবিল বা ভিউ:

  • SELECT: ব্যবহারকারীকে একটি টেবিল বা ভিউ থেকে ডেটা দেখতে অনুমতি দেয়।
  • INSERT: ব্যবহারকারীকে একটি টেবিল বা ভিউতে নতুন ডেটা যোগ করার অনুমতি দেয়।
  • UPDATE: ব্যবহারকারীকে একটি টেবিল বা ভিউতে ডেটা আপডেট করার অনুমতি দেয়।
  • DELETE: ব্যবহারকারীকে একটি টেবিল বা ভিউ থেকে ডেটা মুছে ফেলতে অনুমতি দেয়।
  • EXECUTE: একটি প্রোগ্রাম বা ফাংশন এক্সিকিউট করার অনুমতি।

GRANT Command:

GRANT কমান্ড ব্যবহার করে ব্যবহারকারীকে নির্দিষ্ট প্রিভিলেজ দেওয়া হয়।

Syntax:

GRANT privilege ON object TO user;

উদাহরণ:

-- Granting SELECT and INSERT privileges on the 'employees' table to user 'john'
GRANT SELECT, INSERT ON employees TO john;

এই কমান্ডের মাধ্যমে ব্যবহারকারী john-কে employees টেবিলে SELECT এবং INSERT করার অনুমতি দেওয়া হয়।


২. Authorization (অনুমোদন)

Authorization হল সেই প্রক্রিয়া যার মাধ্যমে ডেটাবেসে কোন ব্যবহারকারী কি কাজ করতে পারবে তা নির্ধারণ করা হয়। এটি ব্যবহারকারীর identity এবং তাদের প্রিভিলেজের ভিত্তিতে কাজ করে। Authorization মেকানিজমের মাধ্যমে বিভিন্ন ব্যবহারকারীকে বিভিন্ন স্তরের অ্যাক্সেস দেয়া হয়, যাতে ডেটাবেসের সুরক্ষা নিশ্চিত করা যায়।

GRANT এবং REVOKE কমান্ড

  • GRANT: এই কমান্ডের মাধ্যমে ব্যবহারকারীকে নির্দিষ্ট প্রিভিলেজ দেওয়া হয়।
  • REVOKE: এই কমান্ডের মাধ্যমে একটি ব্যবহারকারীর দেওয়া প্রিভিলেজ বাতিল করা হয়।

Syntax (GRANT):

GRANT privilege ON object TO user;

Syntax (REVOKE):

REVOKE privilege ON object FROM user;

উদাহরণ:

-- Revoking DELETE privilege from user 'john' on 'employees' table
REVOKE DELETE ON employees FROM john;

এখানে, john ব্যবহারকারীর employees টেবিলে DELETE প্রিভিলেজ বাতিল করা হচ্ছে।


৩. Role Management in Oracle

Role হল একাধিক প্রিভিলেজের একটি সেট যা এক বা একাধিক ব্যবহারকারীর কাছে প্রদান করা যেতে পারে। ব্যবহারকারীকে একটি role প্রদান করলে, তারা সেই role এর অধিকারগুলি (privileges) অর্জন করে।

Role তৈরি করা (Creating a Role):

CREATE ROLE manager_role;

Role-এ Privileges যোগ করা (Granting Privileges to a Role):

GRANT SELECT, INSERT, UPDATE ON employees TO manager_role;

Role ব্যবহারকারীর কাছে প্রদান করা (Assigning a Role to a User):

GRANT manager_role TO john;

এখানে, manager_role রোলটি john ব্যবহারকারীর কাছে প্রদান করা হচ্ছে, এবং তাকে employees টেবিলে SELECT, INSERT, এবং UPDATE করার অনুমতি দেওয়া হচ্ছে।

Role-এ Privileges বাতিল করা (Revoking Privileges from a Role):

REVOKE SELECT, INSERT ON employees FROM manager_role;

এখানে, manager_role রোল থেকে employees টেবিলের SELECT এবং INSERT প্রিভিলেজ বাতিল করা হচ্ছে।


৪. Definer Rights এবং Invoker Rights

Oracle PL/SQL-এ, যখন একটি procedure বা function তৈরি করা হয়, তখন Definer Rights এবং Invoker Rights এর মধ্যে একটি নির্বাচন করতে হয়, যা নির্ধারণ করে কে কোন প্রিভিলেজ প্রয়োগ করতে পারবে।

Definer Rights:

যখন কোনও procedure বা function Definer Rights সহ তৈরি করা হয়, তখন সেই procedure বা function-টি যে ব্যবহারকারী দ্বারা তৈরি করা হয়েছে, তার প্রিভিলেজ ব্যবহার করে এক্সিকিউট হবে। অর্থাৎ, যে ব্যবহারকারী procedure বা function তৈরি করেছে, সে যদি নির্দিষ্ট টেবিলের উপর প্রিভিলেজ না দেয়, তবুও সেই procedure বা function চালানোর সময় ওই টেবিলের উপর কাজ করা যাবে।

Invoker Rights:

যখন procedure বা function Invoker Rights সহ তৈরি করা হয়, তখন যে ব্যবহারকারী ওই procedure বা function এক্সিকিউট করবে, তার প্রিভিলেজ অনুযায়ী কাজ হবে।


৫. Best Practices for User Privileges and Authorization

  1. Principle of Least Privilege: ব্যবহারকারীদের শুধুমাত্র তাদের কাজের জন্য প্রয়োজনীয় প্রিভিলেজ প্রদান করা উচিত। অতিরিক্ত অ্যাক্সেসের মাধ্যমে নিরাপত্তা ঝুঁকি বাড়ে।
  2. Role-Based Access Control (RBAC): বিভিন্ন ধরনের ব্যবহারকারীর জন্য রোল তৈরি করুন এবং সেই রোলগুলোর মাধ্যমে প্রিভিলেজ প্রদান করুন।
  3. Audit Privileges: কোন ব্যবহারকারী কখন এবং কিভাবে কোনো প্রিভিলেজ পেয়েছে, তা মনিটর এবং লগ করা উচিত। এই তথ্য ব্যবহারে নিরাপত্তা নিশ্চিত করা যায়।
  4. Review Privileges Regularly: পুরানো এবং অপ্রয়োজনীয় প্রিভিলেজগুলি নিয়মিত পর্যালোচনা করুন এবং মুছে ফেলুন।

শেষ কথা

User Privileges এবং Authorization হল Oracle Database-এ ডেটাবেস সুরক্ষা এবং অ্যাক্সেস কন্ট্রোলের অন্যতম গুরুত্বপূর্ণ উপাদান। সঠিকভাবে privilege এবং authorization ম্যানেজ করলে ডেটাবেসের সুরক্ষা বাড়ানো যায় এবং অপ্রত্যাশিত বা অবৈধ অ্যাক্সেস রোধ করা সম্ভব হয়। GRANT এবং REVOKE কমান্ডগুলি ব্যবহার করে আপনি বিভিন্ন স্তরের প্রিভিলেজ কন্ট্রোল করতে পারেন, এবং রোল ব্যবস্থাপনা এর আরও এক পদক্ষেপ উন্নতি করতে সাহায্য করে।

Content added By

PL/SQL দিয়ে সিকিউরিটি এনফোর্সমেন্ট

106
106

PL/SQL দিয়ে সিকিউরিটি এনফোর্সমেন্ট বিভিন্ন উপায়ে করা যায়, যার মধ্যে রয়েছে User Privileges, Definer and Invoker Rights, Data Encryption, Access Control, এবং Exception Handling। সঠিক সিকিউরিটি প্রয়োগ করতে PL/SQL কোডে বিভিন্ন সুরক্ষা ব্যবস্থা রাখা জরুরি, বিশেষ করে ডেটাবেস অ্যাপ্লিকেশনগুলিতে। নিচে এই সিকিউরিটি বিষয়গুলো বিস্তারিত আলোচনা করা হয়েছে।

১. Definer Rights এবং Invoker Rights

PL/SQL কোডে Definer Rights এবং Invoker Rights দুটি মৌলিক ধারণা রয়েছে যা সিকিউরিটি নিয়ন্ত্রণে ব্যবহৃত হয়। এগুলি মূলত প্রোগ্রাম ইউনিট (যেমন Procedure, Function, Trigger) এর অধিকার এবং সেগুলির কার্যকরিতা নির্ধারণ করে।

Definer Rights:

  • Definer Rights হল সেই অধিকার যা একটি প্রোগ্রাম ইউনিটের মালিক (যিনি কোডটি লিখেছেন) দ্বারা নিয়ন্ত্রিত। যখন আপনি একটি procedure বা function ডিফাইন করেন এবং সেটি Definer Rights হিসেবে তৈরি হয়, তখন সেই প্রোগ্রামটি যে ব্যবহারকারী দ্বারা ডাকা হয় তার সিস্টেম/ডাটাবেস প্রিভিলেজগুলো irrelevant হয়ে যায়। বরং, কোডটির কার্যকরিতা নির্ধারণ হবে ওই প্রোগ্রামটির মালিকের অধিকার অনুসারে।

Invoker Rights:

  • Invoker Rights হল সেই অধিকার যেখানে একটি প্রোগ্রাম ইউনিটের কার্যকরিতা নির্ধারণ হয় যে ব্যবহারকারী সেই প্রোগ্রামটি কার্যকর করছে তার অধিকার অনুযায়ী। অর্থাৎ, Invoker Rights প্রোগ্রামটি ব্যবহারকারী যে অধিকার ব্যবহার করে, তা তার নিজস্ব অধিকার অনুযায়ী চলে।

Definer vs. Invoker Example:

CREATE OR REPLACE PROCEDURE secure_proc
AS
BEGIN
   -- This code runs with the rights of the definer (the user who owns the procedure)
   SELECT * FROM sensitive_table;
END secure_proc;
/

-- Using Invoker Rights
CREATE OR REPLACE PROCEDURE secure_proc_invoker
AUTHID CURRENT_USER -- This makes the procedure use the rights of the invoker
AS
BEGIN
   -- This code runs with the rights of the user calling the procedure
   SELECT * FROM sensitive_table;
END secure_proc_invoker;
/
  • Definer Rights: secure_proc procedure টি ডিফাইন করা হয়েছে, এবং এটি কাজ করবে মালিকের অধিকার দিয়ে।
  • Invoker Rights: secure_proc_invoker procedure তে AUTHID CURRENT_USER ব্যবহৃত হয়েছে, যার মাধ্যমে কোডটি যে ব্যবহারকারী দ্বারা চালানো হচ্ছে তার অধিকার অনুসারে কাজ করবে।

২. User Privileges এবং Authorization

সিকিউরিটি এনফোর্সমেন্টে User Privileges গুরুত্বপূর্ণ ভূমিকা পালন করে। PL/SQL কোডে User Privileges নিয়ন্ত্রণ করার মাধ্যমে আপনি সিস্টেমের নিরাপত্তা নিশ্চিত করতে পারেন।

Types of Privileges:

  • System Privileges: এটি ব্যবহারকারীদের অ্যাক্সেস এবং ক্ষমতা নিয়ন্ত্রণ করে যেমন CREATE, DROP, ALTER, SELECT, INSERT, ইত্যাদি।
  • Object Privileges: একটি নির্দিষ্ট অবজেক্ট (যেমন টেবিল, ভিউ, সিকোয়েন্স) এর উপর বিশেষ অধিকার। যেমন SELECT, INSERT, UPDATE, DELETE ইত্যাদি।
  • Roles: বিভিন্ন প্রিভিলেজের গ্রুপ। উদাহরণস্বরূপ, DBA রোলটি ব্যবহারকারীদের সব ধরনের অধিকার দেয়, কিন্তু অন্য রোল শুধুমাত্র নির্দিষ্ট অধিকার দেয়।

Granting and Revoking Privileges:

-- Granting privileges to a user
GRANT SELECT, INSERT ON employees TO user1;

-- Revoking privileges from a user
REVOKE SELECT, INSERT ON employees FROM user1;

৩. Data Encryption

ডেটার সুরক্ষা নিশ্চিত করতে Data Encryption একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। PL/SQL-এ ডেটা এনক্রিপশনের জন্য বিভিন্ন পদ্ধতি ব্যবহার করা যায়, যেমন Oracle Advanced Security ফিচারের সাহায্যে ডেটা এনক্রিপশন।

  • Transparent Data Encryption (TDE): TDE ব্যবহার করলে আপনি ডেটাবেসের পুরো ফাইল এনক্রিপ্ট করতে পারেন, যাতে ডেটা অ্যাক্সেস করতে হলে এনক্রিপশন কী প্রয়োজন হয়।
  • Application-Level Encryption: এটির মাধ্যমে নির্দিষ্ট ফিল্ডের ডেটা এনক্রিপ্ট করা হয় যা অ্যাপ্লিকেশন লেভেলে অ্যাক্সেস করা হয়।

Example (Simple Encryption):

-- Encrypting data before inserting
INSERT INTO employees (employee_name, employee_ssn)
VALUES (ENCODE('John Doe', 'AES'), ENCODE('123-45-6789', 'AES'));

-- Decrypting data before displaying
SELECT DECODE(employee_name, 'AES') FROM employees;

৪. Access Control

PL/SQL-এ Access Control হল একটি গুরুত্বপূর্ণ সিকিউরিটি ফিচার যা ডেটাবেস অ্যাক্সেস নিয়ন্ত্রণ করে। Roles এবং Privileges এর মাধ্যমে ব্যবহারকারীদের নির্দিষ্ট ডেটাবেস অপারেশন করতে দেওয়া হয়।

Example:

-- Create Role
CREATE ROLE manager_role;

-- Grant Privileges to Role
GRANT SELECT, INSERT, UPDATE ON employees TO manager_role;

-- Assign Role to User
GRANT manager_role TO john;

এভাবে, আপনি নির্দিষ্ট Role এবং Privileges অ্যাসাইন করে অ্যাক্সেস কন্ট্রোল করতে পারেন।

৫. Exception Handling and Error Management

PL/SQL কোডে Exception Handling খুবই গুরুত্বপূর্ণ। ভুল কোড, ডেটা ইনপুট বা অন্যান্য ভুল পরিস্থিতি গুলি ডেটাবেস অ্যাপ্লিকেশন এর সিকিউরিটি নিয়ে ঝুঁকি তৈরি করতে পারে। RAISE_APPLICATION_ERROR বা অন্যান্য exception handling ফিচার ব্যবহার করে আপনি সঠিকভাবে ত্রুটি পরিচালনা করতে পারেন।

Example:

BEGIN
   -- Code that may raise an error
   UPDATE employees SET salary = -1000 WHERE employee_id = 1001;
EXCEPTION
   WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative');
END;

এখানে, যদি কোনো ভুল (যেমন, নেতিবাচক স্যালারি) ঘটলে তা RAISE_APPLICATION_ERROR ব্যবহার করে কাস্টম ত্রুটি বার্তা প্রদর্শিত হবে।

৬. Auditing and Logging

PL/SQL কোডে Auditing এবং Logging ফিচার ব্যবহার করে আপনি সমস্ত ডেটাবেস অ্যাক্সেস এবং পরিবর্তন লগ করতে পারেন, যা সিকিউরিটির একটি গুরুত্বপূর্ণ অংশ।

  • DBMS_FGA (Fine Grained Auditing): নির্দিষ্ট টেবিল বা কলামে অ্যাক্সেস ট্র্যাক করার জন্য ব্যবহৃত হয়।
  • DBMS_AUDIT: অডিটিং এর মাধ্যমে ডেটাবেস অ্যাক্সেস এবং ডেটা পরিবর্তন লগ করা হয়।

Example:

-- Enabling Fine Grained Auditing
BEGIN
   DBMS_FGA.add_policy(
      object_schema   => 'HR',
      object_name     => 'employees',
      policy_name     => 'audit_salary_changes',
      audit_condition => 'salary < 50000',
      audit_column    => 'salary');
END;
/

এই কোডের মাধ্যমে আপনি Fine Grained Auditing চালু করতে পারেন, যা নির্দিষ্ট শর্তে (যেমন, স্যালারি ৫০,০০০ এর নিচে) ডেটাবেসে পরিবর্তন হওয়া রেকর্ডগুলো ট্র্যাক করবে।


সারাংশ:

PL/SQL দিয়ে সিকিউরিটি এনফোর্সমেন্টের জন্য আপনি বিভিন্ন সিকিউরিটি পদ্ধতি ব্যবহার করতে পারেন, যেমন:

  1. Definer Rights এবং Invoker Rights এর মধ্যে পার্থক্য বুঝে নিরাপত্তা নিশ্চিত করা।
  2. User Privileges এবং Roles এর মাধ্যমে অ্যাক্সেস কন্ট্রোল করা।
  3. Data Encryption ব্যবহার করে ডেটা সুরক্ষা নিশ্চিত করা।
  4. Access Control এবং Auditing এর মাধ্যমে সিস্টেমের উপর কড়া নজর রাখা।
  5. Exception Handling এর মাধ্যমে ভুল বা অপ্রত্যাশিত ডেটা সুরক্ষিতভাবে পরিচালনা করা।

এই সিকিউরিটি ব্যবস্থা ব্যবহার করে PL/SQL কোডে সুরক্ষা এনফোর্স করা সম্ভব।

Content added By
Promotion